home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 1 / Cream of the Crop 1.iso / PROGRAM / UUPC11QS.ARJ / ARBMATH.C < prev    next >
C/C++ Source or Header  |  1991-11-21  |  4KB  |  104 lines

  1. /*--------------------------------------------------------------------*/
  2. /*    a r b m a t h . c                                               */
  3. /*                                                                    */
  4. /*    Arbitary length math routines for UUPC/extended                 */
  5. /*                                                                    */
  6. /*    Copyright (c) 1990, 1991 Andrew H. Derbyshire                   */
  7. /*--------------------------------------------------------------------*/
  8.  
  9. /*--------------------------------------------------------------------*/
  10. /*                     Standard library includes                      */
  11. /*--------------------------------------------------------------------*/
  12.  
  13. #include <stdio.h>
  14. #include <stdlib.h>
  15.  
  16. /*--------------------------------------------------------------------*/
  17. /*                    UUPC/extended include files                     */
  18. /*--------------------------------------------------------------------*/
  19.  
  20. #include "lib.h"
  21. #include "arbmath.h"
  22.  
  23. /*--------------------------------------------------------------------*/
  24. /*                          Global variables                          */
  25. /*--------------------------------------------------------------------*/
  26.  
  27. currentfile();
  28.  
  29. /*--------------------------------------------------------------------*/
  30. /*    a d i v                                                         */
  31. /*                                                                    */
  32. /*    Perform arbitary length division                                */
  33. /*                                                                    */
  34. /*    Returns true if input number was non-zero                       */
  35. /*--------------------------------------------------------------------*/
  36.  
  37. boolean adiv( unsigned char *number,
  38.              const unsigned divisor,
  39.          unsigned *remain,
  40.              const unsigned digits)
  41. {
  42.    size_t subscript;
  43.    boolean nonzero = FALSE;
  44.    *remain = 0;
  45.  
  46.    for ( subscript = 0; subscript < digits; subscript++)
  47.    {
  48.       unsigned digit =  *remain * 0x100 + number[subscript];
  49.       nonzero = nonzero || number[subscript];
  50.       *remain = digit % divisor;
  51.       number[subscript] =  (unsigned char) (digit / divisor);
  52.    } /* for */
  53.    return nonzero;
  54. } /* div */
  55.  
  56. /*--------------------------------------------------------------------*/
  57. /*    m u l t                                                         */
  58. /*                                                                    */
  59. /*    Perform arbitary length multiplication                          */
  60. /*--------------------------------------------------------------------*/
  61.  
  62. void mult(unsigned char *number,
  63.       const unsigned range,
  64.       const unsigned digits)
  65. {
  66.    int subscript = digits;
  67.    unsigned carry = 0;
  68.  
  69.    while( subscript-- > 0)
  70.    {
  71.       unsigned digit = number[subscript] * range + carry;
  72.       number[subscript] = (unsigned char) (digit % 0x100);
  73.       carry = digit / 0x100;
  74.    } /* while */
  75.  
  76.    if ( carry != 0 )     /* Big trouble if overflow occurs   */
  77.       panic();
  78. } /* mult */
  79.  
  80. /*--------------------------------------------------------------------*/
  81. /*    a d d                                                           */
  82. /*                                                                    */
  83. /*    Perform arbitiary length addition                               */
  84. /*--------------------------------------------------------------------*/
  85.  
  86. void add(unsigned char *number,
  87.       const unsigned range,
  88.       const unsigned digits)
  89. {
  90.    int subscript = digits;
  91.    unsigned carry = range;
  92.  
  93.    while(( carry > 0) && ( subscript-- > 0))
  94.    {
  95.       unsigned digit = number[subscript] + carry;
  96.       number[subscript] = (unsigned char) (digit % 0x100);
  97.       carry = digit / 0x100;
  98.    } /* while */
  99.  
  100.    if ( carry != 0 )     /* Big trouble if overflow occurs   */
  101.       panic();
  102.  
  103. } /* add */
  104.